package com.codeyang.mocktest2.mockit;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

import static org.mockito.Mockito.*;

/**
 * 描述: describe
 * 19 spy 与 mock的不同
 * @author shengyang5
 * @version 2021/7/22 15:03
 */

class ExampleService {

    int add(int a, int b) {
        System.out.println("被调用");
        return a + b;
    }

}

public class SpyStudy01 {

    /**
     * spy 和 mock不同，不同点是：
     * <p>
     * spy 的参数是对象示例，mock 的参数是 class。
     * 被 spy 的对象，调用其方法时默认会走真实方法。mock 对象不会。
     * <p>
     * spy 如果没有打桩的方法会走真实的调用对象，如果打桩了会自走打桩的操作,本质上还会走一次
     * <p>
     * mock 没有打桩就返回默认返回值，不走真实方法
     * 打桩了就走打桩的操作
     *
     */
    @Test
    public void test() throws Exception {
        ExampleService spy = spy(new ExampleService());
        // 没有打桩 默认走真实方法
        int add = spy.add(1, 2);
        Assert.assertEquals(3, add);
        System.out.println("add = " + add);
        // 打桩后 不走了,但是实际上还是会先执行一次 用when去设置模拟返回值时，它里面的方法（spy.add()）会先执行一次。
        when(spy.add(Mockito.anyInt(), Mockito.anyInt())).thenReturn(10);
        add = spy.add(1, 2);
        System.out.println("add = " + add);
        Assert.assertEquals(10, add);
    }


}
